大家好,昨天完成了用數值表示屬性資料來訓練的模型,今天要做的就是建立並訓練使用one-hot coding表示屬性資料的模型。
首先取得索引跟預期答案的步驟在昨天做過了,今天就直接進到下一步,將屬性資料用one-hot coding表示,要先取得寶可夢的能力值資料,再透過之前取得的索引產生輸入資料:
pokemon_data_one_hot = np.array(pokemon_df.loc[:, 'HP':])
x_train_one_hot = pokemon_data_one_hot[x_train_index -1].reshape((-1, 54))
x_val_one_hot = pokemon_data_one_hot[x_val_index -1].reshape((-1, 54))
x_test_one_hot = pokemon_data_one_hot[x_test_index -1].reshape((-1, 54))
訓練資料準備好後就要開始建立模型,這個模型的架構跟昨天以數值表示的模型相同,四層全連接層與穿插其中的dropout層,不過輸入的資料不同,使用one-hot coding表示的每隻寶可夢資料有27種,而輸入為兩隻寶可夢資料,因此輸入資料維度為54:
inputs = keras.Input(shape=(54, ))
x = layers.Dense(64, activation='relu')(inputs)
x = layers.Dropout(0.3)(x)
x = layers.Dense(128, activation='relu')(x)
x = layers.Dropout(0.3)(x)
x = layers.Dense(64, activation='relu')(x)
x = layers.Dropout(0.3)(x)
x = layers.Dense(32, activation='relu')(x)
x = layers.Dropout(0.3)(x)
outputs = layers.Dense(1,activation='sigmoid')(x)
model_2 = keras.Model(inputs, outputs, name='model-2')
在設定優化器、損失函數、指數函數、回調函數及訓練模型參數都與昨天的相同:
model_2.compile(keras.optimizers.Adam(),
loss=keras.losses.BinaryCrossentropy(),
metrics=[keras.metrics.BinaryAccuracy()])
log_dir = os.path.join('lab3-logs', 'model-2')
model_cbk = keras.callbacks.TensorBoard(log_dir=log_dir)
model_mckp = keras.callbacks.ModelCheckpoint(model_dir + '/Best-model-2.h5',
monitor='val_binary_accuracy',
save_best_only=True,
mode='max')
history_2 = model_2.fit(x_train_one_hot, y_train,
batch_size=64 ,
epochs=300,
validation_data=(x_val_one_hot, y_val),
callbacks=[model_cbk, model_mckp])